home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / lang / c / xw2.000 / xw2 / xw / csource / xbwparser.y < prev    next >
Encoding:
Lex Description  |  1994-12-14  |  31.7 KB  |  986 lines

  1. %{
  2. /*{{{  */
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <math.h>
  7. #include "xbw.h"
  8. #include "xbwtype.h"
  9.  
  10. /*{{{F xbwtype.h*/
  11. /*:::F xbwtype.h*/
  12. /*}}}  */
  13.  
  14. #define XbWFSy_bf1_printf(a) XbWFSy_bf_printf("%s",a)
  15.  
  16. char scratch[scratchmax][200];
  17. int scratchno=0;
  18. int IFTHEN_val = 1;
  19.  
  20. int errcnt=0;
  21.  
  22. void *(fpar)[100];
  23. double (fpard)[100];
  24. int (fpart)[100];
  25. int fpar_count=0;
  26. char func_lastname[100]="!!Uninitialized!!";
  27.  
  28. #define MAX_mac_lvl 100
  29. #define MAX_fpar     100
  30.  
  31. void *(macpar)[MAX_mac_lvl][MAX_fpar];
  32. int (macpar_type)[MAX_mac_lvl][MAX_fpar];
  33. int macparlvl=1;
  34. int macpar_count=0;
  35.  
  36. void fpar_add(
  37.                  int type,
  38.                  char *txt,
  39.                  double dval,
  40.                  int ival,
  41.                  XbWDDb_DbIVar *ptr);
  42. double fpar_call(char *name);
  43. int macpar_call(char *name);
  44.  
  45. /*}}}  */
  46.  
  47. %}
  48. %union { XbWDDb_DbIVar *ptr; char *strp; double val; symrec *tptr; };
  49.  
  50. %token <val>   ENDFILE
  51. %token <val>   IF
  52. %token <val>   THEN
  53. %type  <strp>  strexp
  54. %token <strp>  NULLPTR
  55. %token <strp>  NPTR
  56. %token <strp>  SPTR
  57. %token <strp>  IPTR
  58. %token <strp>  DPTR
  59. %token <strp>  STR
  60. %token <val>   NUM
  61. %token <tptr>  STRVAR NUMVAR
  62. %type  <val>   funcresult
  63. %type  <val>   numexp
  64. %type  <ptr>   sptrexp
  65. %type  <ptr>   nptrexp
  66. %type  <ptr>   iptrexp
  67. %left  LOPRE
  68. %right '?'
  69. %right '='
  70. %left  '>' '<'
  71. %left  '!'
  72. %left  '-' '+'
  73. %left  '*' '/'
  74. %left  ','
  75. %left  ')'
  76. %right  '('
  77. %left  ']'
  78. %right  '['
  79. %right  '.'
  80. %right  ':'
  81. %left   ';'
  82. %right  '@'
  83. %left  NEG
  84. %left  HIPRE
  85.  
  86. %%
  87.  
  88.  
  89. input:     /* empty */
  90.          | input statement
  91.          ;
  92. statement:
  93.            ';'
  94.          | ENDFILE                    { fpar_call("End");                  }
  95.          | NUMVAR ':' '=' numexp ';'  { $1->value.var = $4;                }
  96.          | NUMVAR '+' '=' numexp ';'  { $1->value.var += $4;               }
  97.          | STRVAR ':' '=' strexp ';'  { strcpy($1->value.strp,$4);         }
  98.          | STRVAR '+' '=' numexp ';'  {
  99.            char sstr[100];
  100.            sprintf(sstr,"%d",(int)$4);
  101.            strcat($1->value.strp,sstr);
  102.            }
  103.          | funcresult ';'             { ; }
  104.          | STR '('  ')' ';' %prec HIPRE  { fpar_call($1); }
  105.          | ':' funcpar ')' ';'        { fpar_call(func_lastname); }
  106.          | '?' funcresult ';' %prec HIPRE {
  107.            printf("\nResult= %17.7f",$2);
  108.            }
  109.          | '?' numexp ';'             { printf("\nNUM =%15.9f",$2);}
  110.          | '?' strexp ';'             { printf("\nSTR =%s",$2);}
  111.  
  112.          | IF '(' numexp ')'          { IFTHEN_val = (int)$3;              }
  113.  
  114.          | '@' STR '(' funcpar ')' ';' %prec HIPRE { macpar_call($2); }
  115.          | '@' STR '(' ')' ';'   %prec HIPRE      { macpar_call($2); }
  116.  
  117.          | nptrexp ':' '=' nptrexp ';' {
  118.            /*{{{  */
  119.            {
  120.            XbWDDb_DbIVar  *TT=$1;
  121.            if ((TT = (XbWDDb_DbIVar*)XbWFDb_VarInh(TT,0,NULL,0)) == NULL) {
  122.              XbWFSy_bf1_printf("\nERROR: Pointer VAR Element not found!");
  123.              errcnt=errcnt+1;
  124.              }
  125.            else {
  126.              if ( (TT->tp & XbWDDb_Typ) == XbWDDb_NPtr){
  127.                XbWDDb_DbINPtr  *TTRG = (XbWDDb_DbINPtr *)TT;
  128.                TTRG->inh = XbWDDb_C_PtrToDbI((char*)$4,XbWDDb_DbISys);
  129.                }
  130.              else {
  131.                XbWFSy_bf1_printf("\nERROR: Target is no (ptr) VAR Element!");
  132.                errcnt=errcnt+1;
  133.                };
  134.              };
  135.            };
  136.            /*}}}  */
  137.            }
  138.          | sptrexp ':' '=' strexp ';' {
  139.            /*{{{  */
  140.            {
  141.            XbWDDb_DbIStr  *TS=(XbWDDb_DbIStr *)$1;
  142.            if ( (TS->tp & XbWDDb_Typ) == XbWDDb_Str){
  143.              int len;
  144.              len = strlen($4);
  145.              if (len < TS->len * 2) {
  146.                strcpy((char*)&(TS->nmi[(TS->tp & XbWDDb_NLen)]),$4);
  147.                }
  148.              else {
  149.                XbWFSy_bf1_printf("\nERROR: Cannot set string because not enough space!");
  150.                errcnt=errcnt+1;
  151.                };
  152.              }
  153.            else {
  154.              XbWFSy_bf1_printf("\nERROR: Target is no (str) VAR Element!");
  155.              errcnt=errcnt+1;
  156.              };
  157.            };
  158.            /*}}}  */
  159.            }
  160.          | iptrexp ':' '=' numexp ';' {
  161.            /*{{{  */
  162.            {
  163.            XbWDDb_DbIVar  *TT=$1;
  164.            if ((TT = (XbWDDb_DbIVar*)XbWFDb_VarInh(TT,0,NULL,0)) == NULL) {
  165.              XbWFSy_bf1_printf("\nERROR: Integer VAR Element not found!");
  166.              errcnt=errcnt+1;
  167.              }
  168.            else {
  169.              switch (TT->tp & XbWDDb_Typ){
  170.                case XbWDDb_Int: {
  171.                                   XbWDDb_DbIInt  *TTRG = (XbWDDb_DbIInt *)TT;
  172.                                   TTRG->inh = $4;
  173.                                   };
  174.                                 break;
  175.                case XbWDDb_Dbl: {
  176.                                   XbWDDb_DbIDbl  *TTRG = (XbWDDb_DbIDbl *)TT;
  177.                                   TTRG->inh = $4;
  178.                                   };
  179.                                 break;
  180.                default:
  181.                                 XbWFSy_bf1_printf("\nERROR: Target is no (int/dbl) VAR Element!");
  182.                                 errcnt=errcnt+1;
  183.                };
  184.              };
  185.            };
  186.            /*}}}  */
  187.            }
  188.          | iptrexp '+' '=' numexp ';' {
  189.            /*{{{  */
  190.            {
  191.            XbWDDb_DbIVar  *TT=$1;
  192.            if ((TT = (XbWDDb_DbIVar*)XbWFDb_VarInh(TT,0,NULL,0)) == NULL) {
  193.              XbWFSy_bf1_printf("\nERROR: Integer VAR Element not found!");
  194.              errcnt=errcnt+1;
  195.              }
  196.            else {
  197.              switch (TT->tp & XbWDDb_Typ){
  198.                case XbWDDb_Int: {
  199.                                   XbWDDb_DbIInt  *TTRG = (XbWDDb_DbIInt *)TT;
  200.                                   TTRG->inh+= $4;
  201.                                   };
  202.                                 break;
  203.                case XbWDDb_Dbl: {
  204.                                   XbWDDb_DbIDbl  *TTRG = (XbWDDb_DbIDbl *)TT;
  205.                                   TTRG->inh+= $4;
  206.                                   };
  207.                                 break;
  208.                default:
  209.                                 XbWFSy_bf1_printf("\nERROR: Target is no (int/dbl) VAR Element!");
  210.                                 errcnt=errcnt+1;
  211.                };
  212.              };
  213.            };
  214.            /*}}}  */
  215.            }
  216.          | iptrexp '-' '=' numexp ';' {
  217.            /*{{{  */
  218.            {
  219.            XbWDDb_DbIVar  *TT=$1;
  220.            if ((TT = (XbWDDb_DbIVar*)XbWFDb_VarInh(TT,0,NULL,0)) == NULL) {
  221.              XbWFSy_bf1_printf("\nERROR: Integer VAR Element not found!");
  222.              errcnt=errcnt+1;
  223.              }
  224.            else {
  225.              switch (TT->tp & XbWDDb_Typ){
  226.                case XbWDDb_Int: {
  227.                                   XbWDDb_DbIInt  *TTRG = (XbWDDb_DbIInt *)TT;
  228.                                   TTRG->inh -= $4;
  229.                                   };
  230.                                 break;
  231.                case XbWDDb_Dbl: {
  232.                                   XbWDDb_DbIDbl  *TTRG = (XbWDDb_DbIDbl *)TT;
  233.                                   TTRG->inh -= $4;
  234.                                   };
  235.                                 break;
  236.                default:
  237.                                 XbWFSy_bf1_printf("\nERROR: Target is no (int/dbl) VAR Element!");
  238.                                 errcnt=errcnt+1;
  239.                };
  240.              };
  241.            };
  242.            /*}}}  */
  243.            }
  244.          | iptrexp '+' '=' numexp '[' numexp ']' ';' {
  245.            /*{{{  */
  246.            {
  247.            XbWDDb_DbIVar  *TT=$1;
  248.            if ((TT = (XbWDDb_DbIVar*)XbWFDb_VarInh(TT,0,NULL,0)) == NULL) {
  249.              XbWFSy_bf1_printf("\nERROR: Integer VAR Element not found!");
  250.              errcnt=errcnt+1;
  251.              }
  252.            else {
  253.              switch (TT->tp & XbWDDb_Typ){
  254.                case XbWDDb_Int: {
  255.                                   XbWDDb_DbIInt  *TTRG = (XbWDDb_DbIInt *)TT;
  256.                                   TTRG->inh+= $4;
  257.                                   if (TTRG->inh > $6){
  258.                                     TTRG->inh = $6;
  259.                                     };
  260.                                   };
  261.                                 break;
  262.                case XbWDDb_Dbl: {
  263.                                   XbWDDb_DbIDbl  *TTRG = (XbWDDb_DbIDbl *)TT;
  264.                                   TTRG->inh+= $4;
  265.                                   if (TTRG->inh > $6){
  266.                                     TTRG->inh = $6;
  267.                                     };
  268.                                   };
  269.                                 break;
  270.                default:
  271.                                 XbWFSy_bf1_printf("\nERROR: Target is no (int/dbl) VAR Element!");
  272.                                 errcnt=errcnt+1;
  273.                };
  274.              };
  275.            };
  276.            /*}}}  */
  277.            }
  278.          | iptrexp '-' '=' numexp '[' numexp ']' ';' {
  279.            /*{{{  */
  280.            {
  281.            XbWDDb_DbIVar  *TT=$1;
  282.            if ((TT = (XbWDDb_DbIVar*)XbWFDb_VarInh(TT,0,NULL,0)) == NULL) {
  283.              XbWFSy_bf1_printf("\nERROR: Integer VAR Element not found!");
  284.              errcnt=errcnt+1;
  285.              }
  286.            else {
  287.              switch (TT->tp & XbWDDb_Typ){
  288.                case XbWDDb_Int: {
  289.                                   XbWDDb_DbIInt  *TTRG = (XbWDDb_DbIInt *)TT;
  290.                                   TTRG->inh -= $4;
  291.                                   if (TTRG->inh < $6){
  292.                                     TTRG->inh = $6;
  293.                                     };
  294.                                   };
  295.                                 break;
  296.                case XbWDDb_Dbl: {
  297.                                   XbWDDb_DbIDbl  *TTRG = (XbWDDb_DbIDbl *)TT;
  298.                                   TTRG->inh -= $4;
  299.                                   if (TTRG->inh < $6){
  300.                                     TTRG->inh = $6;
  301.                                     };
  302.                                   };
  303.                                 break;
  304.                default:
  305.                                 XbWFSy_bf1_printf("\nERROR: Target is no (int/dbl) VAR Element!");
  306.                                 errcnt=errcnt+1;
  307.                };
  308.              };
  309.            };
  310.            /*}}}  */
  311.            }
  312.          |  error ';' { yyerrok; }
  313. ;
  314. funcresult: STR '(' funcpar ')' %prec HIPRE   { $$=fpar_call($1); }
  315. funcpar:
  316.          funcpar strexp  %prec LOPRE { fpar_add(1,$2,0,0,NULL);      }
  317.          | funcpar numexp  %prec LOPRE { fpar_add(2,0,$2,0,NULL);      }
  318.          | funcpar nptrexp %prec LOPRE { fpar_add(10,0,0,0,$2);        }
  319.          | strexp  %prec LOPRE { fpar_add(1,$1,0,0,NULL);      }
  320.          | numexp  %prec LOPRE { fpar_add(2,0,$1,0,NULL);      }
  321.          | nptrexp %prec LOPRE { fpar_add(10,0,0,0,$1);        }
  322. ;
  323. nptrexp:   NPTR ':' strexp '.' strexp %prec HIPRE {
  324.            $$ = (XbWDDb_DbIVar *)XbWFDb_GetDbI($1,$3,$5);
  325.            }
  326.          | NULLPTR {
  327.            /*{{{  */
  328.            (XbWDDb_DbIPtr *)$$ = (XbWDDb_DbIVar *)NULL;
  329.            /*}}}  */
  330.            }
  331. ;
  332. sptrexp:   SPTR ':' strexp '.' strexp %prec HIPRE {
  333.            $$ = (XbWDDb_DbIVar *)XbWFDb_GetDbI($1,$3,$5);
  334.            }
  335. ;
  336. iptrexp:   IPTR ':' strexp '.' strexp %prec HIPRE {
  337.            $$ = (XbWDDb_DbIVar *)XbWFDb_GetDbI($1,$3,$5);
  338.            }
  339.          | DPTR ':' strexp '.' strexp %prec HIPRE {
  340.            $$ = (XbWDDb_DbIVar *)XbWFDb_GetDbI($1,$3,$5);
  341.            }
  342. ;
  343. numexp:    NUM                        { $$ = $1;                           }
  344.          | '(' NUMVAR ')'             { $$ = $2->value.var;                }
  345.          | numexp '=' '=' numexp      { $$ = ($1 == $4);                   }
  346.          | numexp '!' '=' numexp      { $$ = ($1 != $4);                   }
  347.          | numexp '<' numexp          { $$ = ($1 <  $3);                   }
  348.          | numexp '>' numexp          { $$ = ($1 >  $3);                   }
  349.          | numexp '<' '=' numexp      { $$ = ($1 <= $4);                   }
  350.          | numexp '>' '=' numexp      { $$ = ($1 >= $4);                   }
  351.          | numexp '<' '>' numexp      { $$ = ($1 != $4);                   }
  352.          | numexp '+' numexp          { $$ = $1+$3;                        }
  353.          | numexp '-' numexp          { $$ = $1-$3;                        }
  354.          | numexp '/' numexp          { $$ = $1/$3;                        }
  355.          | numexp '*' numexp          { $$ = $1*$3;                        }
  356.          | '-' numexp  %prec      NEG { $$ = -$2;                        }
  357.          | '(' numexp ')'             { $$ = $2;                           }
  358.          | '[' numexp ']'             { $$ = $2;                           }
  359.          | strexp '=' '=' strexp      { $$ = (strcmp($1,$4) == 0);         }
  360.          | strexp '>' strexp          { $$ = (strcmp($1,$3) >  0);         }
  361.          | strexp '<' strexp          { $$ = (strcmp($1,$3) <  0);         }
  362.          | strexp '>' '=' strexp      { $$ = (strcmp($1,$4) >= 0);         }
  363.          | strexp '<' '=' strexp      { $$ = (strcmp($1,$4) <= 0);         }
  364.          | strexp '!' '=' strexp      { $$ = (strcmp($1,$4) != 0);         }
  365.          | funcresult      %prec LOPRE  { $$ = $1 ; };
  366.          | iptrexp                    {
  367.            /*{{{  */
  368.            {
  369.            XbWDDb_DbIVar  *TT= $1;
  370.            if ((TT = (XbWDDb_DbIVar*)XbWFDb_VarInh(TT,0,NULL,0)) == NULL) {
  371.              XbWFSy_bf1_printf("\nERROR: Integer VAR Element not found!");
  372.              errcnt=errcnt+1;
  373.              }
  374.            else {
  375.              switch (TT->tp & XbWDDb_Typ){
  376.                case XbWDDb_Int: {
  377.                                   XbWDDb_DbIInt  *TTRG = (XbWDDb_DbIInt *)TT;
  378.                                   $$ = (double)TTRG->inh;
  379.                                   };
  380.                                 break;
  381.                case XbWDDb_Dbl: {
  382.                                   XbWDDb_DbIDbl  *TTRG = (XbWDDb_DbIDbl *)TT;
  383.                                   $$ = TTRG->inh;
  384.                                   };
  385.                                 break;
  386.                default:
  387.                                 XbWFSy_bf1_printf("\nERROR: Source of ptr is no numeric VAR Element!");
  388.                                 errcnt=errcnt+1;
  389.                };
  390.              };
  391.            };
  392.            /*}}}  */
  393.            }
  394. ;
  395. strexp:    STR %prec LOPRE {
  396.            $$=$1;
  397.            }
  398.          | sptrexp %prec LOPRE {
  399.            /*{{{  */
  400.            {
  401.              XbWDDb_DbIVar  *TT=(XbWDDb_DbIVar *)$1;
  402.              if ((TT = (XbWDDb_DbIVar*)XbWFDb_VarInh(TT,0,NULL,0)) == NULL) {
  403.                XbWFSy_bf1_printf("\nERROR: String VAR Element not found!");
  404.                errcnt=errcnt+1;
  405.                }
  406.              else {
  407.                if ( (TT->tp & XbWDDb_Typ) == XbWDDb_Str){
  408.                  XbWDDb_DbIStr  *TS = (XbWDDb_DbIStr *)TT;
  409.                  $$ = (char *)&(TS->nmi[(TS->tp & XbWDDb_NLen)]);
  410.                  }
  411.                else {
  412.                  XbWFSy_bf1_printf("\nERROR: target of pointer is no string!");
  413.                  errcnt++;
  414.                  };
  415.                };
  416.              };
  417.            /*}}}  */
  418.            }
  419.          | STRVAR {
  420.            $$ = $1->value.strp;
  421.            }
  422.          | strexp ',' strexp %prec HIPRE {
  423.            /*{{{  */
  424.            strcpy((char*)&scratch[scratchno][0],$1);
  425.            strcat((char*)&scratch[scratchno][0],$3);
  426.            $$=(char*)&scratch[scratchno][0];
  427.            scratchno++;
  428.            if (scratchno>=scratchmax){
  429.              scratchno=0;
  430.              };
  431.            /*}}}  */
  432.            }
  433.          | '(' strexp ')' %prec LOPRE {
  434.            $$=$2;
  435.            }
  436.          | '[' strexp ']' %prec LOPRE {
  437.            $$=$2;
  438.            }
  439. ;
  440. %%
  441.  
  442. symrec *sym_table = (symrec *)0;
  443.  
  444. symrec *putsym(char *sym_name, int sym_type){
  445.   /*{{{  */
  446.   symrec *ptr;
  447.   ptr=(symrec*)malloc(sizeof(symrec));
  448.   ptr->malloc_used=0;
  449.   ptr->name=(char*)malloc(strlen(sym_name)+1);
  450.   strcpy(ptr->name,sym_name);
  451.   ptr->type=sym_type;
  452.   ptr->value.strp = 0;
  453.   ptr->value.var = 0;
  454.   ptr->value.ivar = 0;
  455.   ptr->next=(struct symrec *)sym_table;
  456.   sym_table=ptr;
  457.   return ptr;
  458.   };
  459.   /*}}}  */
  460. symrec *getsym(char *sym_name){
  461.   /*{{{  */
  462.   symrec *ptr;
  463.   for (ptr=sym_table;ptr!= (symrec *)0; ptr=(symrec *)ptr->next){
  464.     if (strcmp(ptr->name,sym_name)==0){
  465.       return(ptr);
  466.       };
  467.     };
  468.   
  469.   return(NULL);
  470.   };
  471.   /*}}}  */
  472.  
  473. int put_lval_end_command(void){
  474.   /*{{{  */
  475.   return(ENDFILE);
  476.   };
  477.   
  478.   /*}}}  */
  479. int put_lval_double(double dd){
  480.   /*{{{  */
  481.   yylval.val = dd;
  482.   return(NUM);
  483.   };
  484.   
  485.   /*}}}  */
  486. int put_lval_string(char *str){
  487.   /*{{{  */
  488.   strcpy((char*)&scratch[scratchno][0],str);
  489.   yylval.strp=(char*)&scratch[scratchno][0];
  490.   scratchno++;
  491.   if (scratchno>=scratchmax){
  492.     scratchno=0;
  493.     };
  494.   return(STR);
  495.   };
  496.   
  497.   /*}}}  */
  498. int put_lval_numvar(char *varname){
  499.    /*{{{  */
  500.    symrec *s = getsym(varname);
  501.    if (s==0){
  502.      s=putsym(varname,NUMVAR);
  503.      s->malloc_used=0;
  504.      };
  505.    yylval.tptr = s;
  506.    return(s->type);
  507.    };
  508.    
  509.    /*}}}  */
  510. int put_lval_nullptr(void){
  511.    /*{{{  */
  512.    return(NULLPTR);
  513.    };
  514.    
  515.    /*}}}  */
  516. int put_lval_strvar(char *varname){
  517.   /*{{{  */
  518.   symrec *s = getsym(varname);
  519.   if (s==0){
  520.     s=putsym(varname,STRVAR);
  521.     s->malloc_used=1;
  522.     s->value.strp = (char*)malloc(200);
  523.     };
  524.   yylval.tptr = s;
  525.   return(s->type);
  526.   };
  527.   
  528.   /*}}}  */
  529. int put_lval_pointer(char type, char *str){
  530.   /*{{{  */
  531.   strcpy((char*)&scratch[scratchno][0],str);
  532.   yylval.strp=(char*)&scratch[scratchno][0];
  533.   scratchno++;
  534.   if (scratchno>=scratchmax){
  535.     scratchno=0;
  536.     };
  537.   switch(type){
  538.     case 'p': /*ptr*/  return(NPTR);
  539.     case 's': /*str*/  return(SPTR);
  540.     case 'i': /*int*/  return(IPTR);
  541.     case 'd': /*dbl*/  return(DPTR);
  542.     default: XbWFSy_bf1_printf("\nERROR: illegal pointer type");
  543.              return(STR);
  544.              break;
  545.     };
  546.   };
  547.   
  548.   /*}}}  */
  549. int put_lval_num_macropar(int no){
  550.    /*{{{  */
  551.    yylval.val = (double)((int)macpar[macparlvl-1][no]);
  552.    return(NUM);
  553.    };
  554.    
  555.    /*}}}  */
  556. int put_lval_str_macropar(int no){
  557.    /*{{{  */
  558.    yylval.strp = (char *)macpar[macparlvl-1][no];
  559.    return(STR);
  560.    };
  561.    
  562.    /*}}}  */
  563. int put_lval_var(char *varname){
  564.   /*{{{  */
  565.   symrec *s = getsym(varname);
  566.   if (s==0){
  567.     s=putsym(varname,NUMVAR);
  568.     s->malloc_used=0;
  569.     };
  570.   yylval.tptr = s;
  571.   return(s->type);
  572.   return(0);
  573.   };
  574.   
  575.   /*}}}  */
  576. int put_lval_isvar(char *varname){
  577.   /*{{{  */
  578.   symrec *s = getsym(varname);
  579.   if (s==0){
  580.     return(0);
  581.     };
  582.   return(1);
  583.   };
  584.   
  585.   /*}}}  */
  586. int put_lval_if(void){
  587.   /*{{{  */
  588.   return(IF);
  589.   };
  590.   
  591.   /*}}}  */
  592. int put_lval_then(void){
  593.   /*{{{  */
  594.   return(THEN);
  595.   };
  596.   
  597.   /*}}}  */
  598. int yyerror(char*s){
  599.   XbWFSy_bf_printf("\nERROR in statement after %s:\n",func_lastname);
  600.   printf(s);
  601.   errcnt++;
  602.   return(0);
  603.   };
  604.  
  605. char *fltoa(double dd){
  606.   static char sstr[100];
  607.   sprintf(sstr,"%d",(int)dd);
  608.   return(sstr);
  609.   };
  610.  
  611. void fpar_add(
  612.   /*{{{  */
  613.                    int type,
  614.                    char *txt,
  615.                    double dval,
  616.                    int ival,
  617.                    XbWDDb_DbIVar *ptr){
  618.   fpar_count++;
  619.   switch (type){
  620.     case 1: fpar[fpar_count]= (void*)txt;
  621.             fpart[fpar_count]= XbWDMf_StrPar;
  622.             break;
  623.     case 2: fpar[fpar_count]= (void*)((int)dval);
  624.             fpard[fpar_count]= dval;
  625.             fpart[fpar_count]= XbWDMf_IntPar;
  626.             break;
  627.     case 3: fpar[fpar_count]= (void*)((int)ival);
  628.             fpard[fpar_count]= ival;
  629.             fpart[fpar_count]= XbWDMf_IntPar;
  630.             break;
  631.     case 10: fpar[fpar_count]= (void*)(ptr);
  632.             fpart[fpar_count]= XbWDMf_VLPar;
  633.             break;
  634.     case 11:{
  635.               /*{{{  */
  636.               XbWDDb_DbIVar  *ac_gp = ptr;
  637.               char *dd;
  638.               if ((ac_gp = (XbWDDb_DbIVar*)XbWFDb_VarInh(ac_gp,0,NULL,1)) == NULL) {
  639.                 XbWFSy_bf1_printf("\nERROR: cannot get pointer parameter!");
  640.                 errcnt = errcnt+1;
  641.                 return;
  642.                 };
  643.               switch( ac_gp->tp & XbWDDb_Typ) {
  644.                 case XbWDDb_Str:  dd = (char*)&(((XbWDDb_DbIStr  *)ac_gp)->nmi[ac_gp->tp & XbWDDb_NLen]); break;
  645.                 default:
  646.                   XbWFSy_bf1_printf("\nERROR: cannot get pointer parameter!");
  647.                   errcnt = errcnt+1;
  648.                   return;
  649.                 };
  650.               fpar[fpar_count]= (void*)(dd);
  651.               fpart[fpar_count]= XbWDMf_VIPar;
  652.               printf("\npar. %d ((str)*) = %d",fpar_count,(int)ptr);
  653.               };
  654.               /*}}}  */
  655.     case 12:{
  656.               /*{{{  */
  657.               XbWDDb_DbIVar  *ac_gp = ptr;
  658.               int dd;
  659.               if ((ac_gp = (XbWDDb_DbIVar*)XbWFDb_VarInh(ac_gp,0,NULL,1)) == NULL) {
  660.                 XbWFSy_bf1_printf("\nERROR: cannot get pointer parameter!");
  661.                 errcnt = errcnt+1;
  662.                 return;
  663.                 };
  664.               switch( ac_gp->tp & XbWDDb_Typ) {
  665.                 case XbWDDb_Int:  dd = ((XbWDDb_DbIInt  *)ac_gp)->inh; break;
  666.                 default:
  667.                   XbWFSy_bf1_printf("\nERROR: cannot get pointer parameter!");
  668.                   errcnt = errcnt+1;
  669.                   return;
  670.                 };
  671.               fpar[fpar_count]= (void*)(dd);
  672.               fpart[fpar_count]= XbWDMf_VPPar;
  673.               printf("\npar. %d ((int)*) = %d",fpar_count,(int)ptr);
  674.               };
  675.               /*}}}  */
  676.             break;
  677.     case 13: fpar[fpar_count]= (void*)(ptr);
  678.             fpart[fpar_count]= XbWDMf_VIPar;
  679.             break;
  680.     };
  681.   };
  682.   /*}}}  */
  683. double fpar_call(char *name){
  684.   /*{{{  */
  685.   double result=0;
  686.   fpar[0]=(void*)fpar_count;
  687.   fpart[0]=XbWDMf_AnzPar;
  688.   if (name[1]==0){
  689.     switch(name[0]){
  690.       case 'h':
  691.         printf("\n");
  692.         XbWFSy_bf_printf("%s","XbW Commands:");
  693.         printf("\n");
  694.         fpar[0]=-1;
  695.         fpar[1]=(void*)"s";     XbWFDb_AppStr(&fpar,&fpart);
  696.         fpar[1]=(void*)"i";     XbWFDb_AppInt(&fpar,&fpart);
  697.         fpar[1]=(void*)"c";     XbWFDb_AppCSt(&fpar,&fpart);
  698.         fpar[1]=(void*)"d";     XbWFDb_AppDblVal(&fpar,0);
  699.         printf("\n");
  700.         printf("\n");
  701.         printf("\n");
  702.         break;
  703.   
  704.       case 's': result = XbWFDb_AppStr(&fpar,&fpart); break;
  705.       case 'i': result = XbWFDb_AppInt(&fpar,&fpart); break;
  706.       case 'c': result = XbWFDb_AppCSt(&fpar,&fpart); break;
  707.       case 'o': result = XbWFDb_AppObj(&fpar,&fpart); break;
  708.       case 'd': result = XbWFDb_AppDblVal(&fpar,fpard[2]); break;
  709.       case 'x': result = XbWFMf_StrtHookCmd(&fpar,&fpart); break;
  710.       default: goto errleave;
  711.       };
  712.     goto leave;
  713.     }
  714.   else {
  715.     if (strcmp(name,"bg")==0){
  716.       if (fpart[3] == XbWDMf_IntPar){
  717.         /*{{{  */
  718.         if ( (double)((int)fpar[3]) == (double)fpard[3]){
  719.           result = XbWFDb_AppBg(&fpar,&fpart);
  720.           }
  721.         else {
  722.           char sstr[100];
  723.           sprintf(sstr,"%40.20f",fpard[3]);
  724.           fpart[3]= XbWDMf_DblPar;
  725.           fpar[3]=&sstr;
  726.           result = XbWFDb_AppBg(&fpar,&fpart);
  727.           };
  728.         /*}}}  */
  729.         }
  730.       else {
  731.         result = XbWFDb_AppBg(&fpar,&fpart);
  732.         };
  733.       goto leave; };
  734.     if (strcmp(name,"cn")==0){ result = XbWFDb_AppChn(&fpar,&fpart); goto leave; };
  735.     if (strcmp(name,"eg")==0){ result = XbWFDb_AppGPtr(&fpar,&fpart); goto leave; };
  736.     if (strcmp(name,"pn")==0){ result = XbWFDb_AppNPtr(&fpar,&fpart); goto leave; };
  737.     if (strcmp(name,"tk")==0){ result = XbWFDb_AppTsk(&fpar,&fpart); goto leave; };
  738.     if (strcmp(name,"ff")==0){ result = XbWFDb_AppFloat(&fpar,&fpart); goto leave; };
  739.     if (strcmp(name,"lt")==0){ result = XbWFDb_AppLight(&fpar,&fpart); goto leave; };
  740.     if (strcmp(name,"ng")==0){ result = XbWFDb_NewGrp(&fpar,&fpart); goto leave; };
  741.     if (strcmp(name,"wdw")==0){ result = XbWFDb_AppWdw(&fpar,&fpart); goto leave; };
  742.     if (strcmp(name,"End")==0){
  743.       end_include();
  744.       yyclearin;
  745.       macparlvl--;
  746.       if (macparlvl < 1){
  747.         macparlvl = 1;
  748.         };
  749.       goto leave;
  750.       };
  751.   
  752.     if (strcmp(name,"sin")==0){         result = sin(fpard[1]); goto leave; };
  753.     if (strcmp(name,"cos")==0){         result = cos(fpard[1]); goto leave; };
  754.     if (strcmp(name,"atan")==0){        result = atan(fpard[1]); goto leave; };
  755.     if (strcmp(name,"log")==0){         result = log(fpard[1]); goto leave; };
  756.     if (strcmp(name,"exp")==0){         result = exp(fpard[1]); goto leave; };
  757.     if (strcmp(name,"sqrt")==0){        result = sqrt(fpard[1]); goto leave; };
  758.   
  759.     if (strcmp(name,"Array")==0){       result = XbWFDb_CreateArray(&fpar,&fpart); goto leave; };
  760.   
  761.     if (strcmp(name,"DrawAllWdw")==0){           XbWFWd_DrawAll(); goto leave; };
  762.     if (strcmp(name,"IconAllWdw")==0){           XbWFWd_IconAll(); goto leave; };
  763.     if (strcmp(name,"IconizeWdw")==0){           XbWFWd_Iconize(&fpar); goto leave; };
  764.     if (strcmp(name,"SelectWdw")==0){   result = XbWFWd_Select(&fpar); goto leave; };
  765.     if (strcmp(name,"DrawWdw")==0){              XbWFWd_DrawP(); goto leave; };
  766.   
  767.     if (strcmp(name,"NewProject")==0){  result = XbWFDb_MarkPrj(&fpar,&fpart); goto leave; };
  768.     if (strcmp(name,"NewGroup")==0){    result = XbWFDb_MarlGrp(&fpar); goto leave; };
  769.   
  770.     if (strcmp(name,"Malloc")==0){      result = XbWFDb_CreaSys(&fpar); goto leave; };
  771.     if (strcmp(name,"Exit")==0){                 XbWFSy_SysStop(); goto leave; };
  772.   
  773.     if (strcmp(name,"DumpFile")==0){    result = XbWFDb_DbgSys(&fpar); goto leave; };
  774.     if (strcmp(name,"WriteFile")==0){   result = XbWFDb_WrTable(&fpar,&fpart); goto leave; };
  775.     if (strcmp(name,"ReadFile")==0){    result = XbWFDb_RdTable(&fpar,&fpart); goto leave; };
  776.     if (strcmp(name,"EditFile")==0){    result = XbWFDb_OpenSys(&fpar,&fpart); goto leave; };
  777.   
  778.     if (strcmp(name,"Message")==0){              XbWFTb_PutMessage(&fpar); goto leave; };
  779.     if (strcmp(name,"Alarm")==0){                XbWFTb_PutAlarm(&fpar); goto leave; };
  780.     if (strcmp(name,"Error")==0){                XbWFTb_PutError(&fpar); goto leave; };
  781.     if (strcmp(name,"WaitForButton")==0){        XbWSMs_WButtUpDn(); goto leave; };
  782.     if (strcmp(name,"AnswPReq")==0){    result = XbWFTb_AnswerPopUpReq(&fpar); goto leave; };
  783.     if (strcmp(name,"PopUpBox")==0){             XbWFTb_PopUpBox(&fpar); goto leave; };
  784.     if (strcmp(name,"PopUpMSG")==0){    result = XbWSPu_Msg(&fpar,&fpart); goto leave; };
  785.     if (strcmp(name,"PopUpDIR")==0){    result = XbWSPu_Dir(&fpar,&fpart); goto leave; };
  786.     if (strcmp(name,"PopEditDir")==0){  result = XbWSPu_DirEd(&fpar,&fpart); goto leave; };
  787.   
  788.     if (strcmp(name,"LockWdw")==0){              XbWFWd_LockON(); goto leave; };
  789.     if (strcmp(name,"LockWdwOnClick")==0){       XbWFWd_LockEdit(); goto leave; };
  790.     if (strcmp(name,"UnLockWdw")==0){            XbWFWd_LockOFF(); goto leave; };
  791.   
  792.     if (strcmp(name,"MFXGroup")==0){    result = XbWFMx_RWGroup(&fpar,&fpart); goto leave; };
  793.   
  794.     if (strcmp(name,"EditObj")==0){     result = XbWFOb_EditOnly(&fpar); goto leave; };
  795.     if (strcmp(name,"DispObj")==0){     result = XbWFOb_DispOnly(&fpar); goto leave; };
  796.   
  797.     if (strcmp(name,"ResizeWdw")==0){            XbWSWd_Resize(&fpar); goto leave; };
  798.     if (strcmp(name,"MoveWdw")==0){              XbWSWd_Move(); goto leave; };
  799.     if (strcmp(name,"ClrScr")==0){               XbWFTb_ClrScr(); goto leave; };
  800.     if (strcmp(name,"MoveObjToWdw")==0){result = XbWFOb_MovToWdw(&fpar,&fpart); goto leave; };
  801.     if (strcmp(name,"MouseWarp")==0){   result = XbWFTb_MouseWarp(&fpar,&fpart); goto leave; };
  802.     if (strcmp(name,"XFlush")==0){               XbWFSY_DoXFlush(); goto leave; };
  803.     if (strcmp(name,"RootWindow")==0){  result = XbWSSy_RootWindow(&fpar,&fpart); goto leave; };
  804.     if (strcmp(name,"LoadFont")==0){    result = XbWFDb_LoadFont(&fpar,&fpart); goto leave; };
  805.   
  806.     if (strcmp(name,"PrjName")==0){     result = XbWFDb_PrjName(&fpar,&fpart); goto leave; };
  807.     if (strcmp(name,"PackString")==0){  result = XbWFTb_PackStr(&fpar,&fpart); goto leave; };
  808.     if (strcmp(name,"FFileNames")==0){  result = XbWSOS_FilDir(&fpar); goto leave; };
  809.     if (strcmp(name,"GetWGrp")==0){     result = XbWFDb_StorGrpn(&fpar,&fpart); goto leave; };
  810.     if (strcmp(name,"DebugMfxON")==0){           XbWFMx_DbgON(); goto leave; };
  811.     if (strcmp(name,"DebugMtaON")==0){           XbWFTb_DbgMta(); goto leave; };
  812.     if (strcmp(name,"AutoCloseON")==0){          XbWFTb_AClosON(); goto leave; };
  813.     if (strcmp(name,"AutoCloseOFF")==0){         XbWFTb_AClosOFF(); goto leave; };
  814.     if (strcmp(name,"RedrawON")==0){             XbWFTb_RedrawON(); goto leave; };
  815.     if (strcmp(name,"RedrawOFF")==0){            XbWFTb_RedrawOFF(); goto leave; };
  816.   
  817.     if (strcmp(name,"Unlink")==0){      result = XbWFTb_Unlink(&fpar); goto leave; };
  818.     if (strcmp(name,"Task")==0){        result = XbWSOS_SpwnStd(&fpar,&fpart); goto leave; };
  819.     if (strcmp(name,"ChDir")==0){       result = XbWFSy_ChDir(&fpar,&fpart); goto leave; };
  820.     if (strcmp(name,"LoadObjIcon")==0){ result = XbWSSy_ObjLoadIcon(&fpar,&fpart); goto leave; };
  821.   
  822.     if (strcmp(name,"SelectPrj")==0){  result = XbWFDb_SetProject(&fpar,&fpart); goto leave; };
  823.   
  824.     };
  825.   errleave:;
  826.   XbWFSy_bf_printf("\nERROR: function %s not recognized.",name); errcnt=errcnt+1;
  827.   fpar_count=0;
  828.   return(0);
  829.   leave:;
  830.   strcpy(func_lastname,name);
  831.   fpar_count=0;
  832.   return(result);
  833.   };
  834.   /*}}}  */
  835. int macpar_call(char *name){
  836.   /*{{{  */
  837.   int ii;
  838.   int result=0;
  839.   fpar[0]=(void*)fpar_count;
  840.   fpart[0]=XbWDMf_AnzPar;
  841.   
  842.   for (ii=0;ii<=fpar_count;ii++){
  843.     macpar[macparlvl][ii]=fpar[ii];
  844.     macpar_type[macparlvl][ii]=fpart[ii];
  845.     };
  846.   
  847.   macparlvl++;
  848.   if (macparlvl >= MAX_mac_lvl){
  849.     macparlvl= MAX_mac_lvl;
  850.     };
  851.   
  852.   if (begin_include(name)==0){
  853.     XbWFSy_bf_printf("\nERROR: macro file %s not found;",name);
  854.     };
  855.   yyclearin;
  856.   
  857.   fpar_count=0;
  858.   strcpy(func_lastname,name);
  859.   return(result);
  860.   };
  861.   /*}}}  */
  862.  
  863.  
  864. void  XbWFMf_ReadMF(char *filename){
  865.   /*{{{  */
  866.   
  867.   extern FILE *yyin;
  868.   
  869.   #ifdef YYDEBUG
  870.   yydebug=0;
  871.   #endif
  872.   errcnt=0;
  873.   if (filename == NULL) {
  874.     yyin = stdin;
  875.     }
  876.   else {
  877.     int ii;
  878.     char sstr[200];
  879.     for (ii=0;ii<strlen(filename);ii++){
  880.       if (filename[ii]=='\\'){ filename[ii]='/'; };
  881.       };
  882.     if (filename[0]=='@'){
  883.       strcpy(filename,(char *)&filename[1]);
  884.       };
  885.     yyin = fopen(filename, "r" );
  886.     if (yyin==NULL){
  887.       sprintf(sstr,"%s.mta",filename);
  888.       yyin = fopen( sstr, "r" );
  889.       if (yyin==NULL){
  890.         sprintf(sstr,"/xw/x/%s.mta",filename);
  891.         yyin = fopen( sstr, "r" );
  892.         if (yyin==NULL){
  893.           sprintf(sstr,"%s.xwx",filename);
  894.           yyin = fopen( sstr, "r" );
  895.           if (yyin==NULL){
  896.             XbWFSy_bf_printf("\nERROR: cannot open file %s !",filename);
  897.             return;
  898.             };
  899.           };
  900.         };
  901.       };
  902.     };
  903.   
  904.   yyparse();
  905.   if (yyin != stdin){
  906.     fclose(yyin);
  907.     };
  908.   if (errcnt){ printf("\nOOPS! There were %d parser errors!",errcnt); }
  909.   else {        XbWFSy_bf1_printf("\nFile syntax okay."); };
  910.   };
  911.   /*}}}  */
  912.  
  913. int XbWFMf_ParseMakro(char *macro){
  914.   /*{{{  */
  915.   
  916.   #ifdef YYDEBUG
  917.   yydebug=1;
  918.   #endif
  919.   
  920.   errcnt=0;
  921.   
  922.   begin_macro(macro);
  923.   yyparse();
  924.   
  925.   if (errcnt){ printf("\nOOPS! There were %d parser errors!",errcnt); }
  926.   else {        XbWFSy_bf1_printf("\nMacro syntax okay."); };
  927.   
  928.   return(0);
  929.   };
  930.   /*}}}  */
  931.  
  932. void  XbWFMf_StartMF(char *filename){
  933.   /*{{{  */
  934.   
  935.   char buffer[10000];
  936.   
  937.   extern FILE *yyin;
  938.   
  939.   #ifdef YYDEBUG
  940.   yydebug=0;
  941.   #endif
  942.   
  943.   if (filename == NULL) {
  944.     XbWFSy_bf1_printf("\nERROR: could not open file (null)!");
  945.     return;
  946.     }
  947.   else {
  948.     int ii;
  949.     char sstr[200];
  950.     for (ii=0;ii<strlen(filename);ii++){
  951.       if (filename[ii]=='\\'){ filename[ii]='/'; };
  952.       };
  953.     if (filename[0]=='@'){
  954.       strcpy(filename,(char *)&filename[1]);
  955.       };
  956.     yyin = fopen(filename, "r" );
  957.     if (yyin==NULL){
  958.       sprintf(sstr,"%s.mta",filename);
  959.       yyin = fopen( sstr, "r" );
  960.       if (yyin==NULL){
  961.         sprintf(sstr,"/xw/x/%s.mta",filename);
  962.         yyin = fopen( sstr, "r" );
  963.         if (yyin==NULL){
  964.           XbWFSy_bf_printf("\nERROR: cannot open file %s !",filename);
  965.           return;
  966.           };
  967.         };
  968.       };
  969.     };
  970.   
  971.   fread(buffer,1,9999,yyin);
  972.   
  973.   if (strstr(buffer,"Malloc") != NULL){
  974.     fseek(yyin,0,SEEK_SET);
  975.     fread(buffer,1,((char*)strstr(buffer,"Malloc")-1-(char*)buffer),yyin);
  976.     begin_macro(buffer);
  977.     yyparse();
  978.     }
  979.   else {
  980.     XbWFSy_bf1_printf("\nERROR: Malloc(<mem>); needed at start of first file!");
  981.     };
  982.   fclose(yyin);
  983.   };
  984.   /*}}}  */
  985.  
  986.